`timescale 1ns / 1ps
/////////////////////////////////////////////////////////////////////////////
////                                                                     ////
//// Instituto Tecnologico de Costa Rica                                 ////
////                                                                     ////
//// Sincronizador                                                       ////
////                                                                     ////
//// Este archivo es parte del proyecto: Control de luces de semaforo    ////
//// http://repositorio-charmander.googlecode.com/svn/trunk/             ////
////                                                                     ////
//// Descripcion                                                         ////
//// Implementacion de un control de luces de semaforo como un proyecto  ////
//// del curso de Taller de Diseño Logico.                               ////
////                                                                     ////
//// Funcionamiento:                                                     ////
//// - Este Modulo recibe una serie de señales utilazas para el control  ////
////   interno del semaforo y las sincroniza con su reloj interno,       ////
////   evitando de esta forma que hayan descordinaciones dentro del      ////
////   modulo de la FSM.                                                 ////
////                                                                     ////                                    
//// Autores:                                                            ////
//// - Gia Chen, kathya0812@gmail.com                                    ////
////   Edgar Rojas, edtec217@gmail.com                                   ////
////                                                                     ////
/////////////////////////////////////////////////////////////////////////////

module Sincronizador( _clk_i, sensor_i, sensor_sync_o, walk_request_i, WR_sync_o, reprogram_i, prog_sync_o, _rst_i, _sync_rst_o);
	 
	 //ENTRADAS
	 //clock del modulo
	 input _clk_i; 
	 //señales a sincronizar
	 input sensor_i;
	 input walk_request_i;
	 input reprogram_i; 
	 //reset del modulo
	 input _rst_i;
	 
	 //SALIDAS
	 //señales sincronizadas
	 output sensor_sync_o;
	 output WR_sync_o;
	 output prog_sync_o;
	 output _sync_rst_o;
	 
	 //WIRES
	 //mantienen el valor de la señal entre un flip-flop y el otro
	 wire sensor_temp;
	 wire walk_request_temp;
	 wire reprogram_temp;
	 wire reset_temp;
	 
	 //FLIP-FLOPS
	 //Se llaman a los metodos encargados del sincronizar propiamente las señales
	 //Flip-Flops Sensor
	 FlipFlop FlipFlopSR1 (._clk_i(_clk_i), .por_sincronizar_i(sensor_i), .sincronizado_o(sensor_temp));
	 FlipFlop FlipFlopSR2 (._clk_i(_clk_i), .por_sincronizar_i(sensor_temp), .sincronizado_o(sensor_sync_o));
	 //Flip-Flops Walk Register
	 FlipFlop FlipFlopWR1 (._clk_i(_clk_i), .por_sincronizar_i(walk_request_i), .sincronizado_o(walk_request_temp));
	 FlipFlop FlipFlopWR2 (._clk_i(_clk_i), .por_sincronizar_i(walk_request_temp), .sincronizado_o(WR_sync_o));
	 //Flip-Flops Reprogram
	 FlipFlop FlipFlopRP1 (._clk_i(_clk_i), .por_sincronizar_i(reprogram_i), .sincronizado_o(reprogram_temp));
	 FlipFlop FlipFlopRP2 (._clk_i(_clk_i), .por_sincronizar_i(reprogram_temp), .sincronizado_o(prog_sync_o));
	 //Flip-Flops Reset
	 FlipFlop FlipFlopRST1 (._clk_i(_clk_i), .por_sincronizar_i(_rst_i), .sincronizado_o(reset_temp));
	 FlipFlop FlipFlopRST2 (._clk_i(_clk_i), .por_sincronizar_i(reset_temp), .sincronizado_o(_sync_rst_o));

endmodule
